package com.huyun.web.concurrency.publish;


import com.huyun.web.concurrency.annoations.NotRecommend;
import com.huyun.web.concurrency.annoations.NotThreadSafe;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@NotThreadSafe
@NotRecommend
public class Escape {

    /**
     * 安全发布对象
     *   安全发布对象的四种方法：
     * <p>
     * 在静态初始化函数中初始化一个对象引用
     * 将对象的引用保存到volatile类型域或者AtomicReference对象中
     * 将对象的引用保存到某个正确构造对象的final类型域中
     * 将对象的引用保存到一个由锁保护的域中
     */

    private int thisCanBeEscape = 0;

    public Escape() {
        new InnerClass();
    }

    private class InnerClass {

        public InnerClass() {
            //这里可以在Escape对象完成构造前提前引用到Escape的private变量
            log.info("{}", Escape.this.thisCanBeEscape);
        }
    }

    public static void main(String[] args) {
        new Escape();
    }
}
